package demo.day10


// Kotlin 泛型变幻
/**
 * 1. 类 isMap map takeIf map 是什么类型
 * 2. map int -> str 最终接受是什么类型
 * 3. map per -> str 最终接受是什么类型
 * 4. 验证是否是此类型 与 null
 */
fun main() {
//    val ktBase04 = KtBase04(false, 123)
//    val r = ktBase04.map {
//        it.toString()
//    }
//    println(r)


//    val ktBase04 = KtBase04(true, Person("Kiki"))
//    // Person 对象转化为Student 对象
//    val r: Student? = ktBase04.map {
//        Student(it.name, 18, 'm')
//    }
//    println(r)


    println(map(inputValue = 123) {
        it.toString()
    })
    // lambda 表达式 最后一行就是返回的数据类型
    println(map(inputValue = Student("Kiki", 18, 'm')) {
        Teacher(it.name, it.age, it.sex)
    })
}


class KtBase04<T>(val isMap: Boolean = false, val inputType: T) {
    // 有可能是R 也有可能为null
    inline fun <R> map(mapAction: (T) -> R): R? = mapAction(inputType).takeIf { isMap }
}

// 函数参数里面有lambda 函数前面要加inline
inline fun <I, O> map(isMap: Boolean = true, inputValue: I, mapActionLambda: (I) -> O) =
    if (isMap) mapActionLambda(inputValue) else null

